package devdata

import (
	"emsctrl/db"
	"emsctrl/public"
	"emsctrl/servicedevmap"
	"encoding/json"
	"fmt"
	"time"
)

//type DataVal struct {
//	TimeStamp string  `json:"date,omitempty"`
//	Key       string  `json:"key"`
//	Val       float32 `json:"val"`
//	RegAddr   int     `json:"reg_addr"`
//}
//
//type ReportDataMsg struct {
//	TimeStamp time.Time `json:"time_stamp,optional"`
//	DevName   string    `json:"dev_name"`
//	DevType   string    `json:"dev_type"`
//	ParaType  string    `json:"para_type"`
//	Data      []DataVal `json:"data"`
//}

type RegAV struct {
	Key string  `json:"key"`
	Val float32 `json:"val"`
}

type DevDataMsg struct {
	TimeStamp time.Time `json:"time_stamp,optional"`
	DevName   string    `json:"dev_name"`
	DevType   string    `json:"dev_type"`
	ParaType  string    `json:"para_type"`
	Data      []RegAV   `json:"data"`
}

var DevMap map[string]map[string]DevDataMsg

func init() {
	DevMap = make(map[string]map[string]DevDataMsg)
}

func DataAnalysis(topic string, buffer []byte) {
	dataMsg := DevDataMsg{}
	//fmt.Println("topic:", topic, "payload:", string(buffer))
	msg := public.ReportDataMsg{}
	err := json.Unmarshal(buffer, &msg)
	err = json.Unmarshal(buffer, &dataMsg)
	if err != nil {
		fmt.Println("err:", err)
		return
	}

	//if _, ok := DevMap[msg.DevName]; ok {
	//
	//	if _, ok1 := DevMap[msg.DevName][msg.ParaType]; ok1 {
	//		dataMsg.Regav = DevMap[msg.DevName][msg.ParaType].Regav
	//	} else {
	//		dataMsg.Regav = make(map[string]RegAV)
	//	}
	//	for _, datum := range msg.Data {
	//		av := RegAV{}
	//		av.RegAdd = datum.RegAddr
	//		av.Val = datum.Val
	//		dataMsg.Regav[datum.Key] = av
	//	}
	//	DevMap[msg.DevName][msg.ParaType] = dataMsg
	//} else {
	//
	//	DevMap[msg.DevName] = make(map[string]DevDataMsg)
	//	dataMsg.Regav = make(map[string]RegAV)
	//	for _, datum := range msg.Data {
	//		av := RegAV{}
	//		av.RegAdd = datum.RegAddr
	//		av.Val = datum.Val
	//		dataMsg.Regav[datum.Key] = av
	//	}
	//	DevMap[msg.DevName][msg.ParaType] = dataMsg
	//}
	ReportToDbMsg(dataMsg)
	servicedevmap.GradeupCollodata(msg)
}

//func GetDevRegVal(devName, paraType, key string) (float32, error) {
//	if _, ok := DevMap[devName]; ok {
//		if _, ok = DevMap[devName][paraType]; ok {
//			if _, ok = DevMap[devName][paraType].Regav[key]; ok {
//				return DevMap[devName][paraType].Regav[key].Val, nil
//			} else {
//				return 0, myerr.NewErr().SetErr(fmt.Sprintf("key not exist:", key))
//			}
//		} else {
//			return 0, myerr.NewErr().SetErr(fmt.Sprintf("paraType not exist:", paraType))
//		}
//	} else {
//		return 0, myerr.NewErr().SetErr(fmt.Sprintf("devName not exist:", devName))
//	}
//	return 0, nil
//}

func ReportToDbMsg(data DevDataMsg) {

	basic := db.DeviceBasics{}
	basic.CreatedAt = data.TimeStamp
	basic.Name = data.DevName
	basic.ParaType = data.ParaType
	marshal, _ := json.Marshal(data.Data)
	basic.Data = string(marshal)
	db.Insert(&basic)
}
